package com.sixth.docker.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sixth.core.entity.Patient;
import com.sixth.core.vo.R;
import com.sixth.docker.mapper.PatientMapper;
import com.sixth.docker.service.PatientService;
import com.sixth.docker.vo.PatientVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * @program: sixth-hospital-parent
 * @description:
 * @author: 赵庆龙
 * @create: 2024-08-15 10:43
 **/
@Service
public class PatientServiceImpl implements PatientService {
@Autowired
    private PatientMapper patientMapper;
/**
 * 根据身份证号查询患者信息
 *
 * 此方法通过身份证号作为查询条件，从数据库中检索对应的患者信息它使用了MyBatis Plus的QueryWrapper对象
 * 来构建查询条件，并调用patientMapper的selectOne方法执行查询操作如果找到匹配的患者信息，则将其
 * 封装在R对象中返回
 *
 * @param idCard 患者的身份证号，用作查询条件
 * @return 包含查询结果的R对象如果查询到患者信息，则R对象的数据部分为该患者对象；如果没有查询到，
 *         则R对象的数据部分为null
 */
@Override
public R<Patient> selectByCard(String idCard){
    // 创建QueryWrapper对象，用于构建查询条件
    QueryWrapper<Patient> wrapper = new QueryWrapper<>();
    // 设置查询条件为身份证号等于传入的idCard
    wrapper.eq("id_card",idCard);
    // 执行查询操作，获取查询结果
    Patient patient = patientMapper.selectOne(wrapper);
    // 将查询结果封装在R对象中并返回
    return R.ok(patient);
}

    /**
     * 插入患者信息
     *
     * @param patient 患者对象，包含要插入的患者信息
     * @return 返回一个结果对象，其中包含操作状态和患者信息或错误消息
     *
     * 说明：此方法使用patientMapper插入患者信息到数据库。如果插入成功（影响的行数大于0），
     * 则返回一个表示成功的结果对象，包含插入的患者信息；如果插入失败，则返回一个表示失败
     * 的结果对象，包含错误消息。
     */
    @Override
    public R<Patient> insert(Patient patient) {
        patient.setPassword("$2a$10$cI7e7bgSs9.9nNHhxKO9LuK/Ll.AeZwgUyZb77oD2y3UwwZyZhWG6");
        patient.setCreateTime(new Date());
        // 执行插入操作，返回影响的行数
        int i = patientMapper.insert(patient);
        // 判断插入操作是否成功
        if (i > 0) {
            // 插入成功，返回包含患者信息的成功结果
            return R.ok(patient);
        }
        // 插入失败，返回错误消息
        return R.error("添加失败");
    }
    @Override
    public R<Patient> update(Patient patient) {
        // 执行更新操作，返回影响的行数
        int i = patientMapper.updateById(patient);
        // 判断更新操作是否成功
        if (i > 0) {
            // 更新成功，返回包含患者信息的成功结果
            return R.ok(patient);
        }
        // 更新失败，返回错误消息
        return R.error("更新失败");
    }

    @Override
    public R<Patient> selectByPatientId(String patientId) {
       Patient patient = patientMapper.selectByPatientId(patientId);
        return R.ok(patient);
    }

    @Override
    public R<IPage<Patient>> selectByPage(PatientVo patientVo) {
        IPage<Patient> page = new Page<>(patientVo.getPageNum(), patientVo.getPageSize());
        QueryWrapper<Patient> wrapper = new QueryWrapper<>();
        if (StringUtils.hasText(patientVo.getName())) {
            wrapper.like("name", patientVo.getName());
        }
        if (StringUtils.hasText(patientVo.getIdCard())) {
            wrapper.like("id_card", patientVo.getIdCard());
        }
        if (StringUtils.hasText(patientVo.getPhone())) {
            wrapper.like("phone", patientVo.getPhone());
        }
        wrapper.orderByDesc("create_time");
        IPage<Patient> patientIPage = patientMapper.selectPage(page, wrapper);
        return R.ok(patientIPage);
    }

    @Override
    public R<Patient> selectById(String patientId) {
        QueryWrapper<Patient> wrapper = new QueryWrapper<>();
        wrapper.eq("patient_id",patientId);
        Patient patient = patientMapper.selectOne(wrapper);

        return R.ok(patient);
    }


}
